/*
 * Liquid过滤器 - 短日期过滤器
 * 
 * 主要功能：
 * - 为Liquid模板提供短日期格式化过滤器
 * - 将DateTime转换为短日期字符串
 * - 支持Liquid模板中的日期格式化
 * - 提供可重用的日期格式化功能
 */

using Fluid;
using Fluid.Values;
using OrchardCore.Liquid;
using System;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Liquid;

/// <summary>
/// 短日期过滤器 - 为Liquid模板提供短日期格式化功能
/// 
/// 主要用途：
/// - 为Liquid模板提供短日期格式化过滤器
 //* - 将DateTime转换为短日期字符串
 //* - 支持Liquid模板中的日期格式化
 //* - 提供可重用的日期格式化功能
 //* 
 //* 使用场景：
/// - 在Liquid模板中格式化日期显示
/// - 将DateTime转换为用户友好的短日期格式
/// - 提供统一的日期格式化功能
/// - 支持模板中的日期处理
/// 
/// 设计原因：
/// - 为Liquid模板提供日期格式化功能
/// - 实现统一的日期显示格式
/// - 简化模板中的日期处理
/// - 提供可重用的格式化组件
/// 
/// 设计模式：
/// - 过滤器模式：实现ILiquidFilter接口
/// - 转换模式：将DateTime转换为字符串
/// - 模板模式：支持Liquid模板语法
/// - 值模式：使用FluidValue处理模板值
/// </summary>
// 这个Liquid过滤器可以像{{ Model.ContentItem.CreatedUtc | short_date }}一样使用，
// 以短日期格式渲染CreatedUtc。
public class ShortDateFilter : ILiquidFilter
{
    /// <summary>
    /// 处理方法 - 将DateTime转换为短日期字符串
    /// 
    /// 功能说明：
    /// - 检查输入值是否为DateTime类型
    /// - 将DateTime转换为短日期字符串
    /// - 如果输入不是DateTime则返回原值
    /// - 支持Liquid模板中的日期格式化
    /// 
    /// 处理逻辑：
    /// - 检查输入值类型
    /// - 如果是DateTime则转换为短日期
    /// - 如果不是DateTime则返回原值
    /// - 返回StringValue类型的结果
    /// 
    /// 使用示例：
    /// - {{ Model.ContentItem.CreatedUtc | short_date }}
    /// - {{ Model.BirthDate | short_date }}
    /// </summary>
    /// <param name="input">输入值</param>
    /// <param name="arguments">过滤器参数</param>
    /// <param name="context">Liquid模板上下文</param>
    /// <returns>格式化后的日期字符串</returns>
    public ValueTask<FluidValue> ProcessAsync(FluidValue input, FilterArguments arguments, LiquidTemplateContext context)
    {
        if (input.ToObjectValue() is not DateTime dateInput) return input;

        return new StringValue(dateInput.ToShortDateString());
    }
}
